package org.sloth.core.timer
{
	import flash.events.TimerEvent;
	
	import org.sloth.core.extend.TimerEx;

	/**
	 * 定时任务管理器
	 */	
	public class TimerMgr
	{
//============================================================================
//PROPERTY
//============================================================================
		private static const _uidTimerMap:Object = {};
//============================================================================
//PUBLIC
//============================================================================
		/**
		 * 添加一个定时任务
		 * @param delay 执行间隔(单位:毫秒)，必须大于或者等于1
		 * @param callBack 回调函数，传入参数为 <code>org.common.mgr.timer.TimerVO</code>
		 * @param data 需要传递的数据
		 * @param repeatCount 执行次数，如果为0，表示无限循环执行
		 * @return 该次定时任务标识
		 * 
		 */		
		public static function addTimer(delay:uint, callBack:Function, data:* = null, repeatCount:uint = 1):String
		{
			var vo:TimerVO = new TimerVO(delay, callBack, data, repeatCount);
			addTimerVO(vo);
			return vo.uid;
		}
		
		/**
		 * 通过定时任务标识(<code>id</code>)删除指定定时任务
		 * @param id
		 * 
		 */		
		public static function removeTimer(uid:String):void
		{
			if (!TimerMgr.hasTimer(uid)) return;
			
			var timer:TimerEx = _uidTimerMap[uid];
			timer.stop();
			timer.removeEventListener(TimerEvent.TIMER, timerTimer_hanlder);
			timer.removeEventListener(TimerEvent.TIMER_COMPLETE, timerComplete_handler);
			delete _uidTimerMap[uid];
		}
		
		/**
		 * 判断是否存在指定标识的定时任务
		 * @param id
		 * @return 
		 * 
		 */		
		public static function hasTimer(uid:String):Boolean
		{
			return uid in _uidTimerMap;
		}
//============================================================================
//PRIVATE
//============================================================================
		private static function addTimerVO(vo:TimerVO):void
		{
			var timer:TimerEx = new TimerEx(vo.delay, vo.repeatCount, vo);
			timer.addEventListener(TimerEvent.TIMER, timerTimer_hanlder);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerComplete_handler);
			
			_uidTimerMap[vo.uid] = timer;
			timer.start();
		}
//============================================================================
//HANDLER
//============================================================================
		private static function timerTimer_hanlder(event:TimerEvent):void
		{
			var timer:TimerEx = event.currentTarget as TimerEx;
			var vo:TimerVO = timer.data as TimerVO;
			if (vo.callBack != null) vo.callBack(vo);
		}
		
		private static function timerComplete_handler(event:TimerEvent):void
		{
			var timer:TimerEx = event.currentTarget as TimerEx;
			TimerMgr.removeTimer(TimerVO(timer.data).uid);
		}
	}
}